#!/bin/bash

# 监控脚本安装程序
# 用于自动部署和配置 main_demo 程序的监控脚本

# 配置参数
SCRIPT_NAME="monitor_main_demo.sh"
SCRIPT_PATH="/home/remote/project/build"
TARGET_SCRIPT="/usr/local/bin/$SCRIPT_NAME"
SERVICE_NAME="main_demo_monitor"
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
LOG_DIR="/var/log"
LOG_FILE="$LOG_DIR/${SCRIPT_NAME%.*}.log"
PROGRAM_PATH="/home/remote/project/build/main_demo"  # 要监控的程序路径

# 日志函数
log() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $1"
}

# 错误处理函数
error() {
    log "错误: $1"
    exit 1
}

# 检查是否以root用户运行
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        error "此脚本需要以root用户运行"
    fi
}

# 创建日志目录
create_log_dir() {
    log "创建日志目录: $LOG_DIR"
    mkdir -p "$LOG_DIR" || error "无法创建日志目录"
    chmod 755 "$LOG_DIR"
}

# 复制监控脚本
copy_script() {
    log "复制监控脚本到: $TARGET_SCRIPT"
    
    # 检查源脚本是否存在
    if [ ! -f "$SCRIPT_PATH/$SCRIPT_NAME" ]; then
        log "源脚本不存在，将创建新脚本"
        
        # 创建监控脚本内容
        cat > "$TARGET_SCRIPT" << 'EOF'
#!/bin/bash

# 单实例监控与自动重启脚本
# 用于监控并确保 /home/remote/project/build/main_demo 单实例运行

# 配置参数
PROGRAM="/home/remote/project/build/main_demo"
PROGRAM_NAME="main_demo"  # 用于ps命令匹配的程序名
LOCK_FILE="/var/run/${PROGRAM_NAME}.lock"
LOG_FILE="/var/log/${PROGRAM_NAME}_monitor.log"
RESTART_DELAY=1  # 重启延迟(秒)
CHECK_INTERVAL=10  # 检查间隔(秒)

# 日志函数
log() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $1" | tee -a "$LOG_FILE"
}

# 检查程序是否正在运行
is_program_running() {
    local count=$(ps -ef | grep "$PROGRAM_NAME" | grep -v "grep" | grep -v "$0" | wc -l)
    if [ "$count" -eq 0 ]; then
        return 1  # 程序未运行
    elif [ "$count" -gt 1 ]; then
        log "警告: 发现多个程序实例正在运行! 正在终止所有实例..."
        kill_all_instances
        return 1  # 程序状态异常，视为未运行
    else
        return 0  # 程序正常运行
    fi
}

# 终止所有程序实例
kill_all_instances() {
    local pids=$(ps -ef | grep "$PROGRAM_NAME" | grep -v "grep" | grep -v "$0" | awk '{print $2}')
    if [ -n "$pids" ]; then
        log "终止程序实例: $pids"
        kill -9 $pids 2>/dev/null
        sleep 2  # 等待进程终止
    fi
}

# 启动程序
start_program() {
    log "启动程序: $PROGRAM"
    
    # 检查程序是否存在且可执行
    if [ ! -x "$PROGRAM" ]; then
        log "错误: $PROGRAM 不存在或不可执行"
        return 1
    fi
    
    # 启动程序 (使用nohup使其在后台运行)
    nohup $PROGRAM >/dev/null 2>&1 &
    
    # 验证程序是否成功启动
    sleep 2
    if is_program_running; then
        log "程序已成功启动 (PID: $(get_program_pid))"
        return 0
    else
        log "程序启动失败"
        return 1
    fi
}

# 获取程序PID
get_program_pid() {
    ps -ef | grep "$PROGRAM_NAME" | grep -v "grep" | grep -v "$0" | awk '{print $2}'
}

# 主监控循环
main() {
    # 检查是否以root用户运行
    if [ "$(id -u)" -ne 0 ]; then
        log "错误: 此脚本需要以root用户运行"
        exit 1
    fi
    
    log "监控脚本已启动，正在监控程序: $PROGRAM"
    log "检查间隔: $CHECK_INTERVAL 秒，重启延迟: $RESTART_DELAY 秒"
    
    while true; do
        if is_program_running; then
            log "程序正在运行 (PID: $(get_program_pid))"
        else
            log "程序未运行，将在 $RESTART_DELAY 秒后尝试重启"
            sleep $RESTART_DELAY
            
            # 再次检查，防止在延迟期间程序已被手动启动
            if ! is_program_running; then
                start_program
            else
                log "程序在重启延迟期间已被启动"
            fi
        fi
        
        # 等待下一次检查
        sleep $CHECK_INTERVAL
    done
}

# 执行主监控循环
main
EOF
        
        # 替换程序路径
        sed -i "s|/home/remote/project/build/main_demo|$PROGRAM_PATH|g" "$TARGET_SCRIPT"
    else
        cp "$SCRIPT_PATH/$SCRIPT_NAME" "$TARGET_SCRIPT" || error "无法复制脚本"
    fi
    
    # 添加执行权限
    chmod +x "$TARGET_SCRIPT" || error "无法添加执行权限"
}

# 创建systemd服务文件
create_service_file() {
    log "创建systemd服务文件: $SERVICE_FILE"
    
    cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Main Demo Monitor Service
After=network.target

[Service]
ExecStart=$TARGET_SCRIPT
Restart=always
User=root
Group=root
WorkingDirectory=/root
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
    
    if [ ! -f "$SERVICE_FILE" ]; then
        error "无法创建服务文件"
    fi
}

# 重载systemd并启动服务
start_service() {
    log "重载systemd配置"
    systemctl daemon-reload || error "无法重载systemd配置"
    
    log "启动服务: $SERVICE_NAME"
    systemctl start "$SERVICE_NAME" || error "无法启动服务"
    
    log "启用服务自启动"
    systemctl enable "$SERVICE_NAME" || error "无法启用服务自启动"
    
    log "检查服务状态"
    systemctl status "$SERVICE_NAME" --no-pager
}

# 显示安装完成信息
show_complete_info() {
    echo
    echo "======================================================================"
    echo " 安装完成!"
    echo "----------------------------------------------------------------------"
    echo " 监控脚本位置: $TARGET_SCRIPT"
    echo " 服务文件位置: $SERVICE_FILE"
    echo " 日志文件位置: $LOG_FILE"
    echo "----------------------------------------------------------------------"
    echo " 管理命令:"
    echo "   启动服务:  sudo systemctl start $SERVICE_NAME"
    echo "   停止服务:  sudo systemctl stop $SERVICE_NAME"
    echo "   重启服务:  sudo systemctl restart $SERVICE_NAME"
    echo "   查看状态:  sudo systemctl status $SERVICE_NAME"
    echo "   查看日志:   tail -f $LOG_FILE"
    echo "======================================================================"
}

# 主安装流程
main() {
    check_root
    create_log_dir
    copy_script
    create_service_file
    start_service
    show_complete_info
}

# 执行安装
main